const fs = require('fs')
const path = require('path')
const logger = require('../util/logger')

const {
  root,
  target,
  moreVision,
  lowVision,
  regexName,
  regexSkeleton,
  regexAtlas,
  _author_,
  _version_,
  _right_,
} = require('./config')

const getFilesStartingWith = require('../util/getFilesStartingWith')
const copyAndRenameFiles = require('./script/copyAndRenameFiles')
const reVision = require('./script/reVision')

const getModuleRsV0 = require('./getModule/getModuleRsV0')
const getModuleGenV0 = require('./getModule/getModuleGenV0')

const getFunList = [
  {
    name: '星穹铁道脚本V0',
    call: getModuleRsV0,
  },
  {
    name: '原神脚本V0',
    call: getModuleGenV0,
  },
]

const main = async () => {
  console.log('开始……')
  logger.info('开始……')
  /* 第一步：获取源文件路径 */
  console.log('第一步：获取源文件路径……')
  logger.info('第一步：获取源文件路径……')

  if (!root) {
    console.log(`未设置源文件夹，脚本退出……`)
    logger.error('未设置源文件夹，脚本退出……')
  }
  if (!target) {
    console.log(`未设置目标文件夹，脚本退出……`)
    logger.error('未设置目标文件夹，脚本退出……')
  }
  if (!root || !target) {
    process.exit(1)
  }

  if (fs.existsSync(root) && fs.lstatSync(root).isDirectory()) {
    console.log(`文件获取成功……`)
    logger.info(`文件获取成功……`)
  } else {
    console.log(`文件夹 ${root} 不存在`)
    logger.error(`文件夹 ${root} 不存在，提取失败`)
    process.exit(1)
  }

  /* 第二步：读取文件 */
  console.log('第二步：读取文件……')
  logger.info('第二步：读取文件……')
  const vendorsFile = path.join(root, getFilesStartingWith(root, 'vendors').pop())
  const imagesRoot = path.join(root, 'images')
  if (vendorsFile && fs.existsSync(imagesRoot) && fs.lstatSync(imagesRoot).isDirectory()) {
    console.log('读取文件成功……')
    logger.info('读取文件成功……')
    logger.info(`\n源文件：${vendorsFile} \n 目标：${imagesRoot} \n\n`)
  } else {
    console.log(`源文件 vendors 不存在或 images 文件夹不存在`)
    logger.error(`源文件 vendors 不存在或 images 文件夹不存在，提取失败`)
    process.exit(1)
  }

  /* 第三步：拆解模型列表 */
  console.log('第三步：拆解模型列表……')
  logger.info('第三步：拆解模型列表……')
  let modules = []
  let errList = []

  for (const fun of getFunList) {
    console.log(`正在尝试${fun.name}……`)
    const {
      modules: _modules,
      errList: _errList,
    } = await fun.call(vendorsFile, target, regexName, regexSkeleton, regexAtlas, moreVision)
    modules = _modules
    errList = _errList
    if (modules.length) {
      break
    }
  }
  if (!modules.length) {
    if (errList && errList.length) {
      console.log('拆解模型列表失败')
      logger.error('拆解模型列表失败')
      process.exit(1)
    } else {
      console.log('未识别到模型，请手工操作')
      logger.error('未识别到模型，请手工操作')
      process.exit(1)
    }
  }
  if (errList.length) {
    console.log('部分模型拆解失败')
    logger.error('部分模型拆解失败')
    logger.error(`拆解失败模型：\n${errList.join('\n')}\n\n`)
  }
  logger.info(`模型总数：${modules.length}\n模型列表：\n${modules.join('\n')} \n\n`)
  console.log('拆解模型列表……')
  console.log(modules)

  /* 第四步：复制模型图片 */
  console.log('第四步：复制模型图片……')
  logger.info('第四步：复制模型图片……')
  copyAndRenameFiles(imagesRoot, target, modules, moreVision)

  /* 第五步：自动降低版本 */
  if (moreVision && lowVision) {
    console.log('第五步：自动降低版本……')
    logger.info('第五步：自动降低版本……')
    reVision(target, modules)
  }

  /* 结束 */
  console.log('结束')
  logger.info('结束')
}

console.log(`欢迎使用流星模型提取脚本，当前版本：${_version_}，作者：${_author_}，提取结果版权所有：${_right_}。`)
logger.info(`欢迎使用流星模型提取脚本，当前版本：${_version_}，作者：${_author_}，提取结果版权所有：${_right_}。`)

main()
